# class MyClass:
#     """一个简单的类实例"""
#     i = 12345
#
#     def f(self):
#         return 'hello world'
#
#
# # 实例化类
# x = MyClass()
#
# # 访问类的属性和方法
# print("MyClass 类的属性 i 为：", x.i)
# print("MyClass 类的方法 f 输出为：", x.f())


# class Complex:
#     def __init__(self, realpart, imagpart):
#         self.r = realpart
#         self.i = imagpart
#
#
# x = Complex(3.0, -4.5)
# print(x.r, x.i)  # 输出结果：3.0 -4.5


# class Test:
#     # 类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self
#     def prt(self):
#         # 相当于this
#         self.aa()
#         print(self)
#         print(self.__class__)
#
#     def aa(self):
#         print("aaa")
#
#
# t = Test()
# t.prt()

# 继承

# class People:
#     # 定义基本属性
#     name = ''
#     age = 0
#     # 定义私有属性,私有属性在类外部无法直接进行访问
#     __weight = 0
#
#     # 定义构造方法
#     def __init__(self, n, a, w):
#         self.name = n
#         self.age = a
#         self.__weight = w
#
#     def speak(self):
#         print("{} 说: 我 {} 岁。".format(self.name, self.age))
#
#
# class Student(People):
#     grade = ''
#
#     def __init__(self, n, a, w, g):
#         # 调用父类的构函
#         People.__init__(self, n, a, w)
#         self.grade = g
#
#     # 覆写父类的方法
#     def speak(self):
#         print("{} 说: 我 {} 岁了，我在读 {} 年级".format(self.name, self.age, self.grade))
#
#
# class Teacher:
#     course = ''
#
#     def __init__(self, c):
#         self.course = c
#
#     def speak(self):
#         print("老师说:我教{}这门课程".format(self.course))
#
#
# class ZhangSan(Student, Teacher):
#
#     def __init__(self, c, n, a, w, g):
#         Teacher.__init__(self, c)
#         Student.__init__(self, n, a, w, g)
#
#
# zs = ZhangSan("编程", "tom", 18, 86.5, 3)
# zs.speak()

# 重写

# class Parent:
#     def myMethod(self):
#         print('调用父类方法')
#
#
# class Child(Parent):
#     def myMethod(self):
#         print('调用子类方法')
#
#
# c = Child()  # 子类实例
# c.myMethod()  # 子类调用重写方法
# super(Child, c).myMethod()  # 用子类对象调用父类已被覆盖的方法

# 私有
#
# class JustCounter:
#     __secretCount = 0  # 私有变量 两个_开头
#     publicCount = 0  # 公开变量
#
#     def count(self):
#         self.__secretCount += 1
#         self.publicCount += 1
#         print(self.__secretCount)
#
#
# counter = JustCounter()
# counter.count()
# counter.count()
# print(counter.publicCount)
# print(counter.__secretCount)  # 报错，实例不能访问私有变量


# class Site:
#     # 脚本语言,不需要定义属性,直接操作即可
#     def __init__(self, name, url):
#         self.name = name  # public
#         self.__url = url  # private
#
#     def who(self):
#         print('name  : ', self.name)
#         print('url : ', self.__url)
#
#     def __foo(self):  # 私有方法
#         print('这是私有方法')
#
#     def foo(self):  # 公共方法
#         print('这是公共方法')
#         self.__foo()
#
#
# x = Site('菜鸟教程', 'www.runoob.com')
# x.who()  # 正常输出
# x.foo()  # 正常输出
# x.__foo()  # 报错


# 作用域

# if True:
#     msg = "okok"

# Python 中只有模块（module），类（class）以及函数（def、lambda）才会引入新的作用域
# 其它的代码块（如 if/elif/else/、try/except、for/while等）是不会引入新的作用域的，也就是说这些语句内定义的变量，外部也可以访问
# print(msg)

# class Test:
#     total = 0
#
#     def add(self, s1, s2):
#         self.total = s1 + s2
#         print("add方法中的total为", self.total)
#
#
# test = Test()
# test.add(10, 10)
# print("方法外的total为", test.total)


num = 1


def fun1():
    global num  # 需要使用 global 关键字声明 则可以对外部作用于的值进行操作
    print(num)
    num = 123
    print(num)


fun1()
print(num)
